# coding=utf-8
# 异常的多种结构演示

# 基本结构演示
print("step0")
try:
    print("step1")
    a = 3/2
    print("step2")
except BaseException as e:
    print("step3")
    print(e)
    print(type(e))
print("end!!!!")

# 示例：循环输入数字，如果不是数字则处理异常。知道输入88，则结束循环。
while True:
    try:
        x = int(input("请输入一个数字"))
        print("输入的数字：", x)
        if x == 88:
            print("退出程序")
            break
    except BaseException as e:
        print(e)
        print("异常，输入的不是一个数字")
print("循环数字输入程序结束！")

# 测试try...多个except的结构，注意先后顺序,先子类后父类
try:
    a = input("请输入一个被除数：")
    b = input("请输入一个除数：")
    c = float(a)/float(b)
    print(c)
except ZeroDivisionError:
    print("异常。不能除以0")
except ValueError:
    print("异常。不能将字符串转化成数字")
except NameError:
    print("异常。变量不存在")
except BaseException as e:
    print(e)

# 测试try...except...else结构
try:
    a = input("请输入一个被除数：")
    b = input("请输入一个除数：")
    c = float(a)/float(b)
except BaseException as e:
    print(e)
else:  # 有异常执行except模块,如果没有异常会执行else模块
    print(c)
print("程序结束！")

# 测试try...except...else...finally结构
try:
    a = input("请输入一个被除数：")
    b = input("请输入一个除数：")
    c = float(a)/float(b)
except BaseException as  e:
    print(e)
else:  # 如果不走异常模块就走这个else
    print(c)
finally:  # 不管有没有异常都会走这个
    print("我是finally中的语句，无论发生异常与否，都执行！")
print("程序结束！")

# 测试finally
try:
    f = open("d:/adddd.txt", "r")
    content = f.readline()
    print(content)
except:
    print("文件未找到")
finally:
    print("run in finally。关闭资源")
    try:
        f.close()
    except BaseException as e:
        print(e)
print("程序执行结束！")

# 测试with上下文管理（with不是用来取代try...except...finally结构的，只是作为补充。方便我们再文件管理、网络通信时的开发）
# with 上下文管理可以自动管理资源，在 with 代码块执行完毕后自动还原进入该代码之前的 现场或上下文。不论何种原因跳出 with 块，
# 不论是否有异常,总能保证资源正常释放,极 大的简化了工作，在文件操作、网络通信相关的场合非常常用。
with open("d:/a.txt","r") as f:
    content = f.readline()
    print(content)
print("程序执行结束！")







